Je ne sais pas comment vraiment mettre ma question en mots, alors laissez-moi essayer de l'expliquer avec un exemple: Disons que mon programme se heurte à un comportement étrange lors d'une action spécifique. Je trouve déjà du code qui est la cause de ce comportement étrange. Lors de la désactivation de cette séquence, je ne rencontre pas ce comportement. Malheureusement, j'ai besoin de ce code car quelque chose d'autre ne fonctionne pas alors. Donc, ce que je vais faire ensuite, c'est comprendre pourquoi quelque chose se passe différemment lorsque cet extrait de code est actif. Afin de mieux comprendre ce qui se passe, je veux parfois exécuter toute l'action, y compris le «mauvais code» et parfois sans. Ensuite, je peux comparer le résultat, par exemple ce qui se passe dans l'interface utilisateur ou ce que ma fonction renvoie. La première approche qui me vient à l'esprit est d'exécuter mon programme avec le code activé, de faire ce que je veux, puis d'arrêter mon programme, de commenter le code, de recompiler et de recommencer. Euh ... cela semble stupide. Surtout si j'ai à nouveau besoin d'activer ce code pour voir une autre fois l'autre comportement, puis de l'éteindre, de l'activer, de l'éteindre, etc. Ce n'est pas une option pour moi d'utiliser des points d'arrêt et d'influencer l'ordre des instructions ou de modifier les valeurs pour que je lance ou non des instructions if, des boucles for, etc. Deux exemples: Je débogue un comportement critique de synchronisation et lorsque j'arrête le programme, la synchronisation change de manière significative. Ainsi, le premier point d'arrêt que je peux définir doit être à la fin de l'action. 1 Je m'attends à ce qu'une info-bulle ou une autre fenêtre apparaisse qui est «supprimée» lorsque le focus est donné à VS. Ainsi, je ne peux pas du tout utiliser de points d'arrêt. Ni au début ni à la fin de l'action. Existe-t-il une technique dans Visual Studio 2012 qui me permet de marquer ce code comme facultatif et je peux décider si je veux ou non exécuter cette séquence de code avant d'exécuter l'action? Je pense à quelque chose comme si (vrai | faux) à un niveau supérieur. Je ne cherche pas une solution où j'ai besoin de réexécuter mon programme plusieurs fois. Dans ce cas, je pourrais toujours faire la simple approche de simplement commenter le code avec #if false. 1 Notez que, bien sûr, je peux définir un point d'arrêt lorsque j'ai besoin d'examiner une variable spécifique à une certaine position (si je n'ai pas écrit la valeur en sortie) mais que je désactiverai à nouveau les points d'arrêt pour exécuter toute l'action en un aller.
2020-12-07 23:10:00
Dans le débogueur Visual Studio, vous pouvez définir un point d'arrêt juste en face de votre «code en question». Lorsque le code s'arrête à ce stade, vous pouvez choisir de le laisser continuer ou vous pouvez cliquer avec le bouton droit sur n'importe quelle autre ligne et sélectionner Définir l'instruction suivante. C'est un peu une option étrange, mais j'en suis venu à l'apprécier. | La seule option à laquelle je peux penser est d'ajouter quelque chose à votre interface utilisateur qui n'apparaît que lors du débogage, vous donnant la possibilité d'inclure / d'exclure les opérations en question. Pendant que vous y êtes, vous pouvez également activer la réinitialisation de l'application à un «état connu» à partir de l'interface utilisateur. | Je pense à quelque chose comme si (vrai | faux) à un niveau supérieur. Pourquoi «à un niveau supérieur»? Pourquoi ne pas utiliser exactement cela? Vous voulez un morceau de code parfois exécuté, parfois non, et le commutateur doit être changé au moment de l'exécution, pas au moment de la compilation - cela conduit évidemment à si (condition) { // code en jeu } Le hic ici est le type de condition que vous utiliserez - peut-être une variable que vous définissez sur true dans la version commerciale de votre code, et parfois sur false dans votre version de débogage. Peut-être que la valeur provient d'un fichier de configuration, peut-être d'une variable d'environnement, peut-être calculée par une sorte de logique dans votre programme, peu importe et quand vous le souhaitez. EDIT: vous pouvez également introduire une variable booléenne dans votre code pour condition, l'initialiser à true par défaut et changer sa valeur à l'aide du débogueur quand vous le souhaitez. | Les directives de préprocesseur pourraient être ce que vous recherchez. Ce sont des morceaux de code à exécuter par le compilateur, identifiables en commençant par un caractère # (et stylistiquement, par défaut, ils ne suivent pas le modèle d'indentation de votre code, mais résidant toujours fermement sur le bord gauche de l'éditeur ): #define INCLUDE_DODGY_CODE public void MyMethodWithDodgyBits () { #if INCLUDE_DODGY_CODE myDodgyMethod (); #fin si myOkMethod (); } Dans ce cas, si #define INCLUDE_DODGY_CODE a été inclus, l'appel myDodgyMethod () sera compilé dans votre programme. Sinon, l'appel sera ignoré par le compilateur et n'existera tout simplement pas dans votre binaire. | Il existe plusieurs options de débogage lorsque vous le demandez. Visual Studio propose un certain nombre d'options pour naviguer directement dans le code. Vous pouvez utiliser la fonctionnalité Définir l'instruction suivante pour passer directement à une instruction particulière. Vous pouvez également modifier directement les valeurs via la fenêtre Exécution, le QuickWatch et l'info-bulle qui survole les variables lors du débogage. Visual Studio a également la possibilité de lire l'historique d'exécution. Jetez un œil à IntelliTrace pour commencer. Cela peut être utile lorsque plusieurs domaines de préoccupation interagissent et génèrent la condition d'erreur. Vous pouvez également envelopper vos sections de code dans des blocs conditionnels et définir les variables conditionnelles comme il convient. Cela peut être pendant le débogage ou vous pouvez passer des paramètres via un fichier de configuration. L'utilisation de vérifications conditionnelles peut être plus facile que de parcourir manuellement le code s'il y a un certain nombre d'instructions que vous souhaitez exclure. | Cela dépend parfois de la version de VS et du langage, mais vous pouvez facilement éditer le code (pour le commenter, ou l'envelopper dans un gros #ifdef 0) puis appuyez sur alt + F10 et le compilateur recompilera, reliera et continuera l'exécution comme si vous ne l'aviez jamais tripoté. Mais bien que cela fonctionne à merveille dans VC ++ (depuis VS v6 IIRC), C # peut avoir des problèmes - je trouve (avec VS2010) que je ne peux pas éditer et continuer de cette manière avec des fonctions contenant des instructions lambda (principalement linq) et du code 64 bits jamais utilisé pour faire ça aussi. Pourtant, cela vaut la peine d'être expérimenté car il est parfois très utile. | J'ai travaillé sur des applications qui ont un code optionnel utilisé pour le débogage seul qui ne devrait pas apparaître dans l'environnement de production. Ce segment de code facultatif était pour nous le plus facile à contrôler à l'aide d'un fichier de configuration car il ne nécessitait pas de recompilation pour être modifié. Un tel correctif n'est peut-être pas la fin, tout dépend de votre résultat final, mais il peut vous aider à le résoudre jusqu'à ce qu'un correctif soit trouvé. Si vous avez plusieurs sections facultatives qui doivent être testées en combinaison, ce style de correctif peut nécessiter plusieurs clés dans le fichier de configuration, ce qui pourrait être un inconvénient et une difficulté à suivre. | Votre question n'est pas tout à fait claire, ce qui explique peut-être pourquoi il y a tant de réponses que vous pensez invalides. Vous pouvez envisager de le reformuler si personne ne semble en mesure de répondre à la question. Avec le risque de donner une autre réponse non valide, j'ajouterai quelques commentaires sur la façon dont j'ai traité le problème dans le passé. Le moyen le plus simple est de placer n'importe quel code facultatif dans #if DEBUG // Code optionnel ici #fin si De cette façon, lorsque vous exécutez en mode débogage, le code est implémenté et lorsque vous exécutez en mode version, ce n'est pas le cas. Pour basculer entre les deux, il faut cliquer sur un bouton. J'ai également résolu le même problème de la même manière avec un simple drapeau: booléen runOptionalCode = false; puis if (runOptionalCode) { // Placez le code optionnel ici } Encore,la commutation entre les modes nécessite de changer un mot, c'est donc une tâche simple. Vous le mentionnez dans votre question, mais vous le rejetez pour des raisons qui ne sont pas claires. Comme je l'ai dit, il faut très peu d'efforts pour basculer entre les deux. Si vous devez apporter des modifications entre le code pendant son exécution, le meilleur moyen est d'utiliser un élément d'interface utilisateur ou une frappe qui modifie l'indicateur mentionné dans l'exemple ci-dessus. En fonction de votre application, cela peut demander plus d'efforts que cela ne vaut la peine. Dans le passé, j'ai constaté que lorsque j'ai déjà implémenté un écouteur de clé dans le cadre du projet, le fait d'avoir quelques coups de touches décide d'exécuter mon code de débogage (facultatif) fonctionne mieux. Dans une application sans écouteurs clés, je préfère m'en tenir à l'une des méthodes précédentes. | Ta Réponse StackExchange.ifUsing ("éditeur", fonction () { StackExchange.using ("externalEditor", function () { StackExchange.using ("extraits", function () { StackExchange.snippets.init (); }); }); }, "extraits de code"); StackExchange.ready (fonction () { var channelOptions = { tags: "" .split (""), id: "1" }; initTagRenderer ("". split (""), "" .split (""), channelOptions); StackExchange.using ("externalEditor", function () { // Doit lancer l'éditeur après les extraits, si les extraits sont activés if (StackExchange.settings.snippets.snippetsEnabled) { StackExchange.using ("extraits", function () { createEditor (); }); } autre { createEditor (); } }); function createEditor () { StackExchange.prepareEditor ({ useStacksEditor: faux, heartbeatType: 'réponse', autoActivateHeartbeat: faux, convertImagesToLinks: vrai, noModals: vrai, showLowRepImageUploadWarning: vrai, reputationToPostImages: 10, bindNavPrevention: vrai, suffixe: "", imageUploader: { brandingHtml: "Powered by \ u003ca href = \" https: //imgur.com/ \ "\ u003e \ u003csvg class = \" svg-icon \ "width = \" 50 \ "height = \" 18 \ "viewBox = \ "0 0 50 18 \" fill = \ "none \" xmlns = \ "http: //www.w3.org/2000/svg \" \ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.61182C47.4335 4.61182 46.72554.9762.6943 4.61182C47.4335 4.61182 46.72554.91628 46.094 4.69.4335 4.61182 46.72554.91628 46.094.49.48.4335 4.61182 46.7256 4.9762.692 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \" M32.492 10.1419C32.492 12.6954.0 34184.01448.0 14.6954.0 34184.0 34184.0 14.6954.0 34184.0 14484.0 34184.0 34184.0 34184.0 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.8521 38.2696 11.5455 37.0451 11.4455.5C35.820 521 35.4954 9.60062V6.59049C35.4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/ \ u003e \ u003cpath fill-rule = \" evenodd \ "clip-rule = \" evenodd \ "clip-rule = \" evenodd \ "d. = \ "M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.993 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.993.509 4.66231 29.4502 4.66231C28.993.505 4.66231 29.4502 4.66231C28.993.505 4.66231 29.4502 4.66231C28.993.505 4.66231 29.4502 4.66231C28.993.505 4.66231 29.4502 4.66231C28.993.505 4.66231 29.4502 4.66231C28.993.505 4.66231 29.4502 4.66231C28.99350 .1369 4.56087 21.0134 6.57349 21.0134 9.27932C21.0134 11.9852 23.003 13.913 25.3754 13.913C26.5612 13.913 27.4607 13.4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8341.832C 12.7799 28.121 12.8341.830C 12.7799 28.121 12.8341.830C 28.1161 12.7799 28.121 12.8341.830C 12.1161 12.7799 28.121 12.8341.830C 12.1161 12.7799 28.121 12.8341.8304.1256.28.1256 12.7799 28.121 12.8341.285 12.8341.285 12.7799 28.121 25.121 15.2321 24.1352 14.9821 23.5661 14.7787C23.176 14.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 17.6335 7.0247 7.02417.6335 25.6622 17.6335 7.0247 7.02417.6335 25.6622 17.6335 7,02424 27.2119 7.09766 28.0918 7.94324 28.0918 9.27932C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.1317 9.27932Z \ "/ \ u003e \ u003cpath d = \" M16.802965 11.95128.28.80 19. 5.00066 5.28821 5.00066 6.59049V11.9512C5.00066 13.2535 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.51093 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.51093 6.91179 9.53458 6.91179C10.51093 6.91179 9.53458 6.91179C10.51093 6.91179.94.45.8 6.91179C10.51093 6.91179 9.53458 6.91179C10.51093 6.91179.94.458 6.91179C10.51093 6.91179 9.53458 6.91179C10.51093 6.91179.959.89.93 8.91179.851093 13.8119.89359 13.8117.89 C13.4375 13.8962 13.9157 13.2535 13.9157 11.9512V8.90741C13.9157 7.58817 14.3365 6.91179 15.4269 6.91179C16.4027 6.91179 16.8045 7.58817 16.8045 8.94108V11.9512Z \ "/ \ u003e \ u003cpath d = \ "M3.31675 6.59049C3.31675 5.28821 2.83866 4.66232 1.82471 4.66232C0.791758 4.66232 0.313354 5.28821 0.313354 6.59049V11.9512C0.313354 13.2535 0.791758 13.8962 1.82471 13.8962C2.85798 13.896213,2535 3.31675 11.9512V6.59049Z \ "/ \ u003e \ u003cpath d = \" M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.72 2.8861 3.72 2.8341 1.8341.90056 3.57676 3.72 2.8341 1.8341 3.809 0,400291Z \ "fill = \" # 1BB76E \ "/ \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e", contentPolicyHtml: "Contributions des utilisateurs sous licence \ u003ca href = \" https: //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \" https://stackoverflow.com / legal / content-policy \ "\ u003e (politique de contenu) \ u003c / a \ u003e", allowUrls: vrai }, onDemand: vrai, discardSelector: ".discard-answer" , immédiatementShowMarkdownHelp: true, enableSnippets: true }); } }); Merci d'avoir répondu à Stack Overflow! Veuillez vous assurer de répondre à la question. Fournissez des détails et partagez vos recherches! Mais évitez… Demander de l'aide, des éclaircissements ou répondre à d'autres réponses. Faire des déclarations basées sur des opinions; les sauvegarder avec des références ou une expérience personnelle. Pour en savoir plus, consultez nos conseils sur la rédaction de bonnes réponses. Brouillon enregistré Brouillon rejeté Inscrivez-vous ou connectez-vous StackExchange.ready (fonction () { StackExchange.helpers.onClickDraftSave ('# login-link'); }); Inscrivez-vous avec Google Inscrivez-vous via Facebook Inscrivez-vous par e-mail et mot de passe Soumettre Publier en tant qu'invité Nom Email Obligatoire, mais jamais affiché StackExchange.ready ( fonction () { StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f19425104% 2fcan-i-mark-some-code-as-optional-while-debugging-in visual-studio-2012% 23new-answer ',' question_page '); } ); Publier en tant qu'invité Nom Email Obligatoire, mais jamais affiché Publiez votre réponse Jeter En cliquant sur «Publier votre réponse», vous acceptez nos conditions d'utilisation, notre politique de confidentialité et notre politique de cookies Ce n'est pas la réponse que vous recherchez? Parcourez les autres questions marquées débogage de visual-studio ou posez votre propre question.